This page is about trend in personal consumption in the US

TODO:

Change colors;

Add description.

Import data

consumption_product = readxl::read_excel("data/consumption_product.xlsx") %>% 
  janitor::clean_names() %>% 
  pivot_longer(
    x2019_q1 : x2021_q3,
    names_to = "time",
    names_prefix = "x",
    values_to = "consumption"
  ) 

consumption_function = readxl::read_excel("./data/consumption_function.xlsx") %>% 
  janitor::clean_names() %>% 
  filter(as.numeric(line) <= 28) %>% 
    pivot_longer(
    x2019_q1 : x2021_q3,
    names_to = "time",
    names_prefix = "x",
    values_to = "consumption"
  ) %>% 
  mutate(functions = recode(functions, `Household consumption expenditures (for services)` = "household",
                           `Final consumption expenditures of nonprofit institutions serving households (NPISHs)1` = "nonprofit consumption"))

general_1 = consumption_function %>% 
  filter(functions %in% c("Goods","Services"))

covid_seasonal = read_csv("covid_seasonal.csv") %>% 
  rename(time = date) %>% 
  select(time, quarterly)

consumption_seasonal = general_1 %>% 
  select(-line)

covid_consumption = left_join(consumption_seasonal, covid_seasonal, by = "time")

Consumption and Covid

joint_plot = plot_ly(covid_consumption, x = ~time) %>% 
  add_trace(y = ~consumption, type = "scatter", mode = "lines", color = ~functions, yaixs = "y") %>% 
  add_trace(y = ~quarterly, type = "bar", name = "Covid Cases", yaxis = "y2")  %>% 
  layout(title = "Consumption of Goods and Services Compared with Covid Cases",
         yaxis=list(title = "consumption expenditure", side="left"),
         yaxis2=list(title = "covid cases", side="right",overlaying="y"),
         showlegend=TRUE)

joint_plot

The lowest point actually did not happen as expected at the peak of the pandemic. In the second quarter of 2020, when cases start to rise, personal protective equipment were in a shortage, no effective treatment plans/vaccines are available, the total expenditure of consumption in the US reached to its lowest.

Consumption expenditures of services experienced a steeper change than expenditures of goods due to the shutdown of businesses, the quarantine and the lock down policies etc.

Even though cases keep rising, as

The total consumption expenditure is even larger by now comparing with that before the pandemic. This can be partially explained by inflation and government’s stimulus plan.

Consumption of Goods

general_2 = consumption_function %>% 
  filter(functions %in% c("Durable goods","Nondurable goods","household","nonprofit consumption")) %>% 
  select(-line) %>% 
  pivot_wider(names_from = functions, values_from = consumption) %>% 
  janitor::clean_names()

subfig_1 = plot_ly(general_2, x = ~time, y = ~durable_goods, type = "bar", name = "Durable Goods") %>% 
  add_trace(y = ~nondurable_goods, name = "Nondurable Goods") %>% 
  layout(title = "Decomposition of Consumption of Goods",
         yaxis = list(title = "Consumption"), barmode = "stack",
         legend = list(orientation = 'h', x = 0, y = -0.2))

subfig_1

Durable Goods

durable_goods = 
  consumption_function %>% 
  filter(functions %in% c("Motor vehicles and parts","Furnishings and durable household equipment","Recreational goods and vehicles","Other durable goods")) 

durable_goods %>% 
  plot_ly(x = ~time, y = ~consumption, type = 'scatter', mode = 'lines', yaxis="y", color = ~functions) %>% 
  layout(title = "Decomposition of Consumption in Durable Goods",
         legend = list(orientation = 'h', x = 0, y = -0.2))

Nondurable Goods

nondurable_goods = 
  consumption_function %>% 
  filter(functions %in% c("Food and beverages purchased for off-premises consumption","Clothing and footwear","Gasoline and other energy goods","Other nondurable goods")) 

nondurable_goods %>% 
  plot_ly(x = ~time, y = ~consumption, type = 'scatter', mode = 'lines', yaxis="y", color = ~functions) %>% 
  layout(title = "Decompostion of Consumption in Nondurable Goods",
         legend = list(orientation = 'h', x = 0, y = -0.2))

Consumption of Services

subfig_2 = plot_ly(general_2, x = ~time, y = ~household, type = "bar", name = "Household", colors = "Dark2") %>% 
  add_trace(y = ~nonprofit_consumption, name = "Nonprofit Consumption", colors = "Dark2") %>% 
  layout(title = "Decomposition of Consumption in Services ",
         yaixs = list(title = "Consumption"), barmode = "stack",
         legend = list(orientation = 'h', x = 0, y = -0.2))

subfig_2

Household Services

household_consumption =
  consumption_function %>% 
  filter(functions %in% c("Housing and utilities","Health care","Transportation services","Recreation services","Food services and accommodations","Financial services and insurance","Other services")) 

household_consumption %>% 
  plot_ly(x = ~time, y = ~consumption, type = 'scatter', mode = 'lines', yaxis="y", color = ~functions) %>% 
  layout(title = "Decomposition of Consumption in Household Services",
         legend = list(orientation = 'h', x = 0, y = -0.2))

Consumption Structure Analysis

durable_goods_radar = durable_goods %>% 
  filter(time %in% c("2019_q1", "2021_q3")) %>% 
  select(functions, time, consumption)  %>% 
  pivot_wider(names_from = functions, values_from = consumption) 

total = rep(1,5)
start = rep(0,5)
durable_goods_radar = rbind(total, start, durable_goods_radar)[,-1]
rownames(durable_goods_radar) = c("1", "2", "2019_q1", "2021_q3")
colnames(durable_goods_radar) = c("motor", "furnishing", "recreation", "other")
durable_goods_radar[3,] = durable_goods_radar[3,]/1473292
durable_goods_radar[4,] = durable_goods_radar[4,]/1984391

durable_goods_radar[-c(1,2),] %>% 
  knitr::kable()
motor furnishing recreation other
0.3394256 0.2387931 0.2761163 0.1456649
0.3303764 0.2366091 0.2889768 0.1440371
radar_1 = radarchart(durable_goods_radar) 

nondurable_goods_radar = nondurable_goods %>% 
  filter(time %in% c("2019_q1", "2021_q3")) %>% 
  select(functions, time, consumption)  %>% 
  pivot_wider(names_from = functions, values_from = consumption) 

nondurable_goods_radar = rbind(total, start, nondurable_goods_radar)[,-1]
rownames(nondurable_goods_radar) = c("1", "2", "2019_q1", "2021_q3")
colnames(nondurable_goods_radar) = c("food/beverage", "clothing", "energy", "other")
nondurable_goods_radar[3,] = nondurable_goods_radar[3,]/2909515
nondurable_goods_radar[4,] = nondurable_goods_radar[4,]/3509766

nondurable_goods_radar[-c(1,2),] %>% 
  knitr::kable()
food/beverage clothing energy other
0.3483196 0.1351971 0.1113089 0.4051741
0.3551200 0.1367587 0.1078300 0.4002914
radar_2 = radarchart(nondurable_goods_radar)

household_consumption_radar = household_consumption %>% 
  filter(time %in% c("2019_q1", "2021_q3")) %>% 
  select(functions, time, consumption)  %>% 
  pivot_wider(names_from = functions, values_from = consumption) 

total = rep(1,8)
start = rep(0,8)
household_consumption_radar = rbind(total, start, household_consumption_radar)[,-1]
rownames(household_consumption_radar) = c("1", "2", "2019_q1", "2021_q3")
colnames(household_consumption_radar) = c("housing", "healthcare", "transports", "recreation", "accomodation", "finance", "other")
household_consumption_radar[3,] = household_consumption_radar[3,]/9336650
household_consumption_radar[4,] = household_consumption_radar[4,]/9984527

household_consumption_radar[-c(1,2),] %>% 
  knitr::kable()
housing healthcare transports recreation accomodation finance other
0.2714813 0.2579861 0.0513708 0.0614477 0.1057028 0.1238437 0.1281675
0.2793373 0.2583677 0.0461719 0.0516284 0.1083851 0.1279287 0.1281807
radar_3 = radarchart(household_consumption_radar)